# 2. 导入创建的蓝图对象, 使用蓝图实现路由
from flask import request
from flask import url_for

from info import constants
from info.models import User,Category, News
from info.utils.response_code import RET
from . import index_blue
from info import redis_store
from flask import render_template, current_app, session, jsonify


@index_blue.route('/news_list')
def get_news_list():
    #获取参数 cid page per_page,拿不到参数就先设默认值
    cid=request.args.get('cid',1)
    page=request.args.get('page',1)
    per_page=request.args.get('per_page',constants.NEWS_LIST_MAX_NEWS)

    #校验参数的正确性
    try:
        cid=int(cid)
        page=int(page)
        per_page=int(per_page)
    except Exception as e:
        current_app.logger.error(e)
        return jsonify(errno=RET.PARAMERR,errmsg='参数不正确')

    #根据参数,从数据库里拿数据
    filters=[News.status==0]
    if cid!=1:
        filters.append(News.category_id==cid)
    try:
        paginates=News.query.filter(*filters).order_by(News.create_time.desc()).paginate(page,per_page,False)
    except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg='数据库错误')

    #将数据模型转为字典传给前端
    news_list=[]
    for news in paginates.items if paginates.items else []:
        news_list.append(news.to_basic_dict())
    current_page=paginates.page
    total_pages=paginates.pages
    data={'current_page':page,
          'total_pages':total_pages,
          'news_list':news_list
    }

    return jsonify(errno=RET.OK,errmsg='成功',data=data)


@index_blue.route('/')
def index():
    # 显示用户名和头像--> 核心逻辑--> 当重新加载首页时, 查询用户数据给模板

    # 1. 从session获取用户id
    user_id = session.get('user_id', None)

    # 2. 根据用户id查询数据
    user = None
    if user_id:
        try:
            user = User.query.get(user_id)
        except Exception as e:
            current_app.logger.error(e)

    # 查询新闻分类信息
    try:
        category_models=Category.query.all()
    except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg='数据库错误')

    category_list=[]
    for category in category_models if category_models else []:
        category_list.append(category.to_dict())

    # 查询点击量前十的新闻
    try:
        news_rank_models=News.query.order_by(News.clicks.desc()).limit(constants.NEWS_RANK_MAX_NEWS)
    except Exception as e:
            current_app.logger.error(e)
            return jsonify(errno=RET.DBERR,errmsg='数据库错误')

    news_rank_list=[]

    for news in news_rank_models if news_rank_models else []:
        news_rank_list.append(news.to_basic_dict())


    # 3. 封装成data字典, 传入模板
    data = {
        # 在处理不同接口的返回数据时, 不需要全部返回, 可以值返回需要的数据
        # user.to_index_dict(): 将模型对象转换为需要的数据字典
        'user': user.to_index_dict() if user else None,
        'category_list':category_list,
        'click_news_list':news_rank_list

    }

    return render_template('news/index.html', data=data)


# 浏览器会自动请求该地址, 以获取网站的图标
@index_blue.route('/favicon.ico')
def favicon():
    # current_app: 是一次请求中, 产生的app的对象. 能够拥有所有app的属性和方法
    # 使用时无需关心原来的app在那个文件中
    # send_static_file: 发送静态文件. 查找到目录默认从static开始的
    return current_app.send_static_file('news/favicon.ico')
